// hj44_Sudoku [DFS递归] 数独
// https://www.nowcoder.com/practice/78a1a4ebe8a34c93aac006c44f6bf8a1
// 数独（Sudoku）是一款大众喜爱的数字逻辑游戏。玩家需要根据9X9盘面上的已知数字，
// 推算出所有剩余空格的数字，并且满足每行、每列、每个3X3粗线宫内的数字均含1-9，并且不重复。
// 对于DFS的题而言，其实重点在于两个方面，一个是函数参数，像这题的话就是当前所在的位置，
// 另一个就是递归的终止条件，然后在适当进行剪枝。
// 数据范围：输入一个 9*9 的矩阵
// 输入包含已知数字的9X9盘面数组[空缺位以数字0表示]
// 输出完整的9X9盘面数组
// 输入：
// 0 9 2 4 8 1 7 6 3
// 4 1 3 7 6 2 9 8 5
// 8 6 7 3 5 9 4 1 2
// 6 2 4 1 9 5 3 7 8
// 7 5 9 8 4 3 1 2 6
// 1 3 8 6 2 7 5 9 4
// 2 7 1 5 3 8 6 4 9
// 3 8 6 9 1 4 2 5 7
// 0 4 5 2 7 6 8 3 1
// 输出：
// 5 9 2 4 8 1 7 6 3
// 4 1 3 7 6 2 9 8 5
// 8 6 7 3 5 9 4 1 2
// 6 2 4 1 9 5 3 7 8
// 7 5 9 8 4 3 1 2 6
// 1 3 8 6 2 7 5 9 4
// 2 7 1 5 3 8 6 4 9
// 3 8 6 9 1 4 2 5 7
// 9 4 5 2 7 6 8 3 1

#include <bits/stdc++.h>

#include <algorithm>
#include <iostream>
#include <map>
#include <set>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>
using namespace std;

//#define DEBUG_
#ifdef DEBUG_
#define PF(...) printf(__VA_ARGS__)
#define FRE(x)                            \
  freopen("d:/oj/" #x ".in", "r", stdin), \
      freopen("d:/oj/" #x ".out", "w", stdout)
#define FREC fclose(stdin), fclose(stdout)
#else
#define PF(...)
#define FRE(x)
#define FREC
#endif

// typedef pair<int,int> Pos;
struct Pos {
  int x = 0, y = 0;
};
const static int max_x = 9;
const static int max_y = 9;
static bool GameFinished = false;
static vector<vector<size_t> > mp;
// ---------> x
// |
// |
// V
// y

//  mp[row][col]
//  mp[py][px]
//  mp[i][j]
bool checkUnique(size_t row, size_t col, size_t val) {
  for (size_t i = 0; i < max_x; i++) {  // row
    if (mp[row][i] == val) {
      return false;
    }
  }
  for (size_t i = 0; i < max_y; i++) {  // col, x不变, y++
    if (mp[i][col] == val) {
      return false;
    }
  }
  size_t cellR = row / 3 * 3;
  size_t cellC = col / 3 * 3;
  for (size_t i = cellR; i < cellR + 3; i++) {
    for (size_t j = cellC; j < cellC + 3; j++) {
      if (mp[i][j] == val) {
        PF("cellxy= %d,%d, [ij=%d,%d]=%d, [pxy=%d,%d]=%d\n", cellC, cellR, i, j,
           mp[i][j], col, row, val);
        return false;
      }
    }
  }
  return true;
}

void dfs(size_t nRow, size_t nCol) {
  if (nCol == max_y) {
    nRow++;
    nCol = 0;
  }
  if (nRow == max_y && nCol == 0) {
    GameFinished = true;
    return;
  }
  PF("val=  %d,%d,%d\n", nCol, nRow, mp[nRow][nCol]);
  if (mp[nRow][nCol] > 0) {
    dfs(nRow, nCol + 1);
    return;
  }
  // try 1-9
  for (size_t val = 1; val < 10; val++) {
    PF("chk== %d,%d,%d\n", nCol, nRow, val);
    if (!checkUnique(nRow, nCol, val)) {
      continue;
    }
    mp[nRow][nCol] = val;
    PF("set   %d,%d,%d\n", nCol, nRow, val);
    dfs(nRow, nCol + 1);
    if (GameFinished) {
      return;
    }
    mp[nRow][nCol] = 0;
    PF("clr   %d,%d,%d\n", nRow, nCol, val);
  }
}

int main() {
  FRE(sudo);
  vector<vector<size_t> > vv(9, vector<size_t>(9, 0));
  for (size_t i = 0; i < max_x; i++) {
    for (size_t j = 0; j < max_y; j++) {
      scanf("%d", &vv[i][j]);
    }
  }
  mp = vv;
  dfs(0, 0);

  for (auto vt : mp) {
    for (auto n : vt) {
      printf("%d ", n);
    }
    printf("\n");
  }
  return 0;
}
